package com.qfedu.food.service.impl;


import com.qfedu.food.config.RedisKeyConfig;
import com.qfedu.food.config.SystemConfig;
import com.qfedu.food.dao.TUserDao;
import com.qfedu.food.dao.TUserLogDao;
import com.qfedu.food.dto.TUserDto;
import com.qfedu.food.pojo.TUser;
import com.qfedu.food.pojo.TUserLog;
import com.qfedu.food.service.intf.TUserService;
import com.qfedu.food.util.*;
import com.qfedu.food.vo.R;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Optional;

@Service
public class TUserServiceImpl implements TUserService {
    @Value("${scode.passkey}")
    private String key;
    @Autowired
    private TUserDao dao;
    @Autowired
    private TUserLogDao logDao;

    @Override
    public R checkPhone(String phone) {
        //Optional.ofNullable()
        // 校验参数的合法性
        if (StringUtil.isNoEmpty(phone)){
            // 查询用户是否存在
            TUser tUser = dao.selectByPhone(phone);
            if (tUser == null){
                return R.ok();
            }
        }
        // 存在  非法  就不可用
        return R.fail();
    }

    @Override
    @Transactional // 开启事务
    public R register(TUserDto dto) {
        // 校验参数的合法性
        if (StringUtil.isNoEmpty(dto.getPhone(),dto.getPassword())){
            // 校验手机号是否唯一性
            if (dao.selectByPhone(dto.getPhone()) == null){
                // 可用 -密文
                if (StringUtil.isNoEmpty(key)){
                    dto.setPassword(EncryptUtil.aesenc(key,dto.getPassword()));
                    TUser tUser = new TUser(dto.getPhone(), dto.getPassword());
                    if (dao.insert(tUser) > 0){
                        logDao.insert(new TUserLog(tUser.getId(), SystemConfig.USER_ADD,"用户注册，手机号：" + dto.getPhone(),""));
                        return R.ok();
                    }
                }
            }
        }
        return R.fail();
    }

    @Override
    public R queryAll() {
        return R.ok(dao.selectAll());
    }

    @Override
    public R login(TUserDto dto) {
        // 校验
        if (dto != null){
            if (StringUtil.isNoEmpty(dto.getPhone(), dto.getPassword())){
                // 唯一登录
                // 查询用户
                TUser tUser = dao.selectByPhone(dto.getPhone());
                // 验证用户是否可用
                if (tUser != null && tUser.getFlag() == SystemConfig.LOGIN_OK){
                    // 验证密码
                    if (tUser.getPassword().equals(EncryptUtil.aesenc(key,dto.getPassword()))){
                        String phoneKey = RedisKeyConfig.LOGIN_PHONE + dto.getPhone();
                        // 验证当前手机号是否在线 -确保唯一登录
                        if (RedissonUtil.isHave(phoneKey)){
                            // 在线-唯一登录 需要把原来挤掉
                            String tk = RedissonUtil.getStr(phoneKey);
                            // 删除原来的令牌
                            RedissonUtil.delKeys(RedisKeyConfig.LOGIN_TOKEN + tk);
                            // 记录挤掉信息-方便推送
                            RedissonUtil.setHash(RedisKeyConfig.LOGIN_OUT,tk,"你好，你的" + DateUtil.getTime() + "在其他设备上登录");
                        }
                        // 账号没问题- 生成令牌
                        String token = JwtUtil.createToken(tUser.getPhone());
                        // 存储Redis String 有效期 Key:val:
                        // 令牌---用户
                        RedissonUtil.setStr(RedisKeyConfig.LOGIN_TOKEN + token,new JSONObject(tUser).toString(),RedisKeyConfig.LOGIN_TOKEN_TIMES);
                        RedissonUtil.setStr(RedisKeyConfig.LOGIN_PHONE + dto.getPhone(),token,RedisKeyConfig.LOGIN_TOKEN_TIMES);
                        // 新增登陆日志
                        logDao.insert(new TUserLog(tUser.getId(), SystemConfig.USER_LOGIN,"完成了登陆",""));
                        return R.ok(token);
                    }
                }
            }
        }
        return R.fail();
    }
}
